﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DTO_MechSys;
using System.Data.SqlClient;
using System.Data;

namespace DAL_MechSys
{
    public class DALProduto : DALBase
    {
        public void Excluir(int produtoID)
        {
            try
            {
                string storedProssidere = "sp_ExcluirProduto";
                SqlParameter[] parameters =

                        {                    
                           new SqlParameter("@produtoID", produtoID)                                    
                        };
                ExecuteNonQuery(storedProssidere, parameters);

            }

            catch (SqlException)
            {
                throw;
            }
        }

        public void Inserir(DTOProduto dtoProduto)
        {
            try
            {
                string storedProssidere = "sp_InserirProduto";
                SqlParameter[] parameters =
                
                { 
                   new SqlParameter("@descricao", dtoProduto.Descricao),
                   new SqlParameter("@valor", dtoProduto.Valor),
                   new SqlParameter("@quantidade", dtoProduto.Quantidade),
                   new SqlParameter("@categoriaID", dtoProduto.CategoriaID),
                   new SqlParameter("@fornecedorID", dtoProduto.FornecedorID),                       
                   new SqlParameter("@estoqueMinimo", dtoProduto.EstoqueMinimo),
                   new SqlParameter("@valorCompra", dtoProduto.ValorCompra),
                   new SqlParameter("@descontinuando", dtoProduto.Descontinuado)

                };
                ExecuteNonQuery(storedProssidere, parameters);

            }

            catch (SqlException)
            {
                throw;
            }
        }

        public void Atualizar(DTOProduto dtoProduto)
        {
            try
            {
                string storedProssidere = "sp_AtualizarProduto";
                SqlParameter[] parameters =

                {                  
                   new SqlParameter("@produtoID", dtoProduto.ProdutoID),
                   new SqlParameter("@descricao", dtoProduto.Descricao),
                   new SqlParameter("@valor", dtoProduto.Valor),
                   new SqlParameter("@quantidade", dtoProduto.Quantidade),
                   new SqlParameter("@categoriaID", dtoProduto.CategoriaID),
                   new SqlParameter("@fornecedorID", dtoProduto.FornecedorID),                       
                   new SqlParameter("@estoqueMinimo", dtoProduto.EstoqueMinimo),
                   new SqlParameter("@valorCompra", dtoProduto.ValorCompra),
                   new SqlParameter("@descontinuando", dtoProduto.Descontinuado)         
                };
                ExecuteNonQuery(storedProssidere, parameters);

            }

            catch (SqlException)
            {
                throw;
            }
        }

        public DataTable DescricaoProdutosEstoqueBaixo()
        {
            DataTable lstProduto = new DataTable();
            lstProduto.Columns.Add("Descrição");

            string aux;
            try
            {
                string storedProssidere = "sp_DescricaoProdutosEstoqueBaixo";
                using (SqlDataReader sqlDataReader = ExecuteReader(storedProssidere))
                {
                    while (sqlDataReader.Read())
                    {
                        aux = (string)sqlDataReader["Descricao"];
                        lstProduto.Rows.Add(aux);
                    }
                }
            }
            catch (SqlException)
            {
                throw;
            }
            if (lstProduto.Rows.Count > 0)
                return lstProduto;
            else
                return new DataTable();
        }

        public DataTable BuscarProdutoCadastradosEstoque()
        {
            DataTable dtEstoque = new DataTable();
            dtEstoque.Columns.Add("Produto ID");
            dtEstoque.Columns.Add("Produto");
            dtEstoque.Columns.Add("Valor Compra");
            dtEstoque.Columns.Add("Valor Venda");
            dtEstoque.Columns.Add("Quantidade");
            dtEstoque.Columns.Add("Categoria");
            dtEstoque.Columns.Add("Fornecedor");
            dtEstoque.Columns.Add("Estoque Mínimo");
            dtEstoque.Columns.Add("Descontinuando", typeof(bool));

            DataRow dr;

            try
            {
                string storedProssidere = "sp_BuscarProdutosCadastradosEstoque";
                using (SqlDataReader sqlDataReader = ExecuteReader(storedProssidere))
                {
                    while (sqlDataReader.Read())
                    {
                        dr = dtEstoque.NewRow();


                        if (!string.IsNullOrEmpty(sqlDataReader["ProdutoID"].ToString()))
                            dr["Produto ID"] = (int)sqlDataReader["ProdutoID"];
                        if (!string.IsNullOrEmpty(sqlDataReader["Produto"].ToString()))
                            dr["Produto"] = sqlDataReader["Produto"].ToString();
                        if (!string.IsNullOrEmpty(sqlDataReader["Compra"].ToString()))
                            dr["Valor Compra"] = string.Format("{0:0.00}", double.Parse(sqlDataReader["Compra"].ToString()));
                        if (!string.IsNullOrEmpty(sqlDataReader["Venda"].ToString()))
                            dr["Valor Venda"] = string.Format("{0:0.00}", double.Parse(sqlDataReader["Venda"].ToString()));
                        if (!string.IsNullOrEmpty(sqlDataReader["Quantidade"].ToString()))
                            dr["Quantidade"] = (int)sqlDataReader["Quantidade"];
                        if (!string.IsNullOrEmpty(sqlDataReader["Descricao"].ToString()))
                            dr["Categoria"] = sqlDataReader["Descricao"].ToString();
                        if (!string.IsNullOrEmpty(sqlDataReader["Fornecedor"].ToString()))
                            dr["Fornecedor"] = sqlDataReader["Fornecedor"].ToString();
                        if (!string.IsNullOrEmpty(sqlDataReader["EstoqueM"].ToString()))
                            dr["Estoque Mínimo"] = (int)sqlDataReader["EstoqueM"];
                        if (!string.IsNullOrEmpty(sqlDataReader["Descontinuando"].ToString()))
                            dr["Descontinuando"] = bool.Parse(sqlDataReader["Descontinuando"].ToString());
                        dtEstoque.Rows.Add(dr);


                    }
                }
            }
            catch (SqlException)
            {
                throw;
            }
            return dtEstoque;
        }



        public List<DTOProduto> BuscarProdutoCadastrados()
        {
            List<DTOProduto> lstProduto = new List<DTOProduto>();

            try
            {
                string storedProssidere = "sp_BuscarProdutosCadastrados";
                using (SqlDataReader sqlDataReader = ExecuteReader(storedProssidere))
                {
                    while (sqlDataReader.Read())
                    {

                        DTOProduto dtoProduto = CriarProduto(sqlDataReader);

                        lstProduto.Add(dtoProduto);

                    }
                }
            }
            catch (SqlException)
            {
                throw;
            }
            return lstProduto;
        }

        public bool VerificaSeClienteIDExiste(int produtoID)
        {
            bool Existe = false;

            try
            {
                string storedProssidere = "sp_VerificaSeClienteIDExiste";

                SqlParameter[] parameters =
            {
                new SqlParameter("@clienteID", produtoID),                            
            };

                using (SqlDataReader sqlDataReader = ExecuteReader(storedProssidere, parameters))
                {
                    if (sqlDataReader.Read())
                    {
                        int NumReg = (int)sqlDataReader["NumeroRegistros"];
                        if (NumReg > 0)
                        {
                            Existe = true;
                        }

                    }
                }
                return Existe;

            }
            catch (Exception)
            {
                throw;
            }

        }

        public void AlterarQuantidade(DTOProduto dtoProduto)
        {
            try
            {
                string storedProssidere = "sp_AlterarQuantidadeProduto";
                SqlParameter[] parameters =

                {                  
                   new SqlParameter("@produtoID", dtoProduto.ProdutoID),
                   new SqlParameter("@quantidade", dtoProduto.Quantidade)
                };
                ExecuteNonQuery(storedProssidere, parameters);

            }

            catch (SqlException)
            {
                throw;
            }
        }

        public List<DTOProduto> BuscarProdutoCadastradosLinha()
        {
            List<DTOProduto> lstProduto = new List<DTOProduto>();

            try
            {
                string storedProssidere = "sp_BuscarProdutosCadastradosLinha";
                using (SqlDataReader sqlDataReader = ExecuteReader(storedProssidere))
                {
                    while (sqlDataReader.Read())
                    {

                        DTOProduto dtoProduto = CriarProduto(sqlDataReader);

                        lstProduto.Add(dtoProduto);

                    }
                }
            }
            catch (SqlException)
            {
                throw;
            }
            return lstProduto;
        }

        public DataTable BuscaProdutosOrdem(int OrdemPendenteID)
        {
            DataTable lstProduto = new DataTable();
            lstProduto.Columns.Add("OrdemDetalheProdutoID");
            lstProduto.Columns.Add("ID");
            lstProduto.Columns.Add("Descrição");
            lstProduto.Columns.Add("Quantidade");
            lstProduto.Columns.Add("Valor");
            lstProduto.Columns.Add("Desconto");
            lstProduto.Columns.Add("Total");
            DataRow dr;
            try
            {
                string storedProssidere = "sp_BuscarProdutosOrdemPendente";
                SqlParameter[] parameters =

                {      
                   new SqlParameter("@ordemPendenteid", OrdemPendenteID)         
                };
                using (SqlDataReader sqlDataReader = ExecuteReader(storedProssidere, parameters))
                {
                    while (sqlDataReader.Read())
                    {
                        dr = lstProduto.NewRow();
                        dr["OrdemDetalheProdutoID"] = (int)sqlDataReader["OrdemDetalheProdutoID"];
                        dr["ID"] = (int)sqlDataReader["ProdutoID"];
                        dr["Descrição"] = (string)sqlDataReader["Descricao"];
                        dr["Quantidade"] = (int)sqlDataReader["Quantidade"];
                        dr["Valor"] = string.Format("{0:0.00}", (double.Parse(sqlDataReader["PrecoUnitario"].ToString())));
                        dr["Desconto"] = string.Format("{0:0.00}", (double.Parse(sqlDataReader["Desconto"].ToString())));
                        dr["Total"] = string.Format("{0:0.00}", ((double.Parse(sqlDataReader["PrecoUnitario"].ToString()) - double.Parse(sqlDataReader["Desconto"].ToString())) * double.Parse(sqlDataReader["Quantidade"].ToString())));
                        lstProduto.Rows.Add(dr);
                    }
                }
            }
            catch (SqlException)
            {
                throw;
            }
            if (lstProduto.Rows.Count > 0)
                return lstProduto;
            else
                return new DataTable();
        }
        public DataTable BuscaProdutosOrdemDevolucao(int OrdemID)
        {
            DataTable lstProduto = new DataTable();
            lstProduto.Columns.Add("OrdemDetalheProdutoID");
            lstProduto.Columns.Add("ID");
            lstProduto.Columns.Add("Descrição");
            lstProduto.Columns.Add("Quantidade");
            lstProduto.Columns.Add("Valor");
            lstProduto.Columns.Add("Desconto");
            lstProduto.Columns.Add("Total");
            DataRow dr;
            try
            {
                string storedProssidere = "sp_BuscarProdutosOrdem";
                SqlParameter[] parameters =

                {      
                   new SqlParameter("@ordemid", OrdemID)         
                };
                using (SqlDataReader sqlDataReader = ExecuteReader(storedProssidere, parameters))
                {
                    while (sqlDataReader.Read())
                    {
                        dr = lstProduto.NewRow();
                        dr["OrdemDetalheProdutoID"] = (int)sqlDataReader["OrdemDetalheProdutoID"];
                        dr["ID"] = (int)sqlDataReader["ProdutoID"];
                        dr["Descrição"] = (string)sqlDataReader["Descricao"];
                        dr["Quantidade"] = (int)sqlDataReader["Quantidade"];
                        dr["Valor"] = string.Format("{0:0.00}", (double.Parse(sqlDataReader["PrecoUnitario"].ToString())));
                        dr["Desconto"] = string.Format("{0:0.00}", (double.Parse(sqlDataReader["Desconto"].ToString())));
                        dr["Total"] = string.Format("{0:0.00}", ((double.Parse(sqlDataReader["PrecoUnitario"].ToString()) - double.Parse(sqlDataReader["Desconto"].ToString())) * double.Parse(sqlDataReader["Quantidade"].ToString())));
                        lstProduto.Rows.Add(dr);
                    }
                }
            }
            catch (SqlException)
            {
                throw;
            }
            if (lstProduto.Rows.Count > 0)
                return lstProduto;
            else
                return new DataTable();
        }

        public List<DTOProduto> BuscarProdutoCadastradosForaLinha()
        {
            List<DTOProduto> lstProduto = new List<DTOProduto>();

            try
            {
                string storedProssidere = "sp_BuscarProdutosCadastradosForaLinha";
                using (SqlDataReader sqlDataReader = ExecuteReader(storedProssidere))
                {
                    while (sqlDataReader.Read())
                    {

                        DTOProduto dtoProduto = CriarProduto(sqlDataReader);

                        lstProduto.Add(dtoProduto);

                    }
                }
            }
            catch (SqlException)
            {
                throw;
            }
            return lstProduto;
        }

        private DTOProduto CriarProduto(SqlDataReader sqlDataReader)
        {
            try
            {
                DTOProduto dtoProduto = new DTOProduto();

                if (!string.IsNullOrEmpty(sqlDataReader["CategoriaID"].ToString()))
                {
                    dtoProduto.CategoriaID = (int)sqlDataReader["CategoriaID"];
                }

                if (!string.IsNullOrEmpty(sqlDataReader["Descricao"].ToString()))
                {
                    dtoProduto.Descricao = (string)sqlDataReader["Descricao"];
                }

                if (!string.IsNullOrEmpty(sqlDataReader["EstoqueMinimo"].ToString()))
                {
                    dtoProduto.EstoqueMinimo = (int)sqlDataReader["EstoqueMinimo"];
                }

                if (!string.IsNullOrEmpty(sqlDataReader["FornecedorID"].ToString()))
                {
                    dtoProduto.FornecedorID = (int)sqlDataReader["FornecedorID"];
                }

                if (!string.IsNullOrEmpty(sqlDataReader["ProdutoID"].ToString()))
                {
                    dtoProduto.ProdutoID = (int)sqlDataReader["ProdutoID"];
                }

                if (!string.IsNullOrEmpty(sqlDataReader["Quantidade"].ToString()))
                {
                    dtoProduto.Quantidade = (int)sqlDataReader["Quantidade"];
                }

                if (!string.IsNullOrEmpty(sqlDataReader["Valor"].ToString()))
                {
                    dtoProduto.Valor = float.Parse(sqlDataReader["Valor"].ToString());
                }

                if (!string.IsNullOrEmpty(sqlDataReader["ValorCompra"].ToString()))
                {
                    dtoProduto.ValorCompra = (float.Parse(sqlDataReader["ValorCompra"].ToString()));
                }

                if (!string.IsNullOrEmpty(sqlDataReader["Descontinuando"].ToString()))
                {
                    dtoProduto.Descontinuado = bool.Parse(sqlDataReader["Descontinuando"].ToString());
                }

                return dtoProduto;
            }
            catch (Exception)
            {
                throw;
            }
        }

        public List<DTOProduto> PesquisarProdutos(string descricao, int codigo)
        {
            List<DTOProduto> lstProduto = new List<DTOProduto>();

            try
            {
                string storedProssidere = "sp_BuscarProdutosPesquisa";

                SqlParameter[] parameters =                
                { 
                   new SqlParameter("@string", descricao),
                   new SqlParameter("@int", codigo)

                };
                using (SqlDataReader sqlDataReader = ExecuteReader(storedProssidere, parameters))
                {
                    while (sqlDataReader.Read())
                    {
                        DTOProduto dtoProduto = CriarProduto(sqlDataReader);

                        lstProduto.Add(dtoProduto);
                    }
                }
            }
            catch (SqlException)
            {
                throw;
            }
            return lstProduto;
        }

        public List<DTOProduto> PesquisarProdutosLinha(string descricao, int codigo)
        {
            List<DTOProduto> lstProduto = new List<DTOProduto>();

            try
            {
                string storedProssidere = "sp_BuscarProdutosPesquisaLinha";

                SqlParameter[] parameters =                
                { 
                   new SqlParameter("@string", descricao),
                   new SqlParameter("@int", codigo)

                };
                using (SqlDataReader sqlDataReader = ExecuteReader(storedProssidere, parameters))
                {
                    while (sqlDataReader.Read())
                    {
                        DTOProduto dtoProduto = CriarProduto(sqlDataReader);

                        lstProduto.Add(dtoProduto);
                    }
                }
            }
            catch (SqlException)
            {
                throw;
            }
            return lstProduto;
        }

        public List<DTOProduto> PesquisarProdutosForaLinha(string descricao, int codigo)
        {
            List<DTOProduto> lstProduto = new List<DTOProduto>();

            try
            {
                string storedProssidere = "sp_BuscarProdutosPesquisaForaLinha";

                SqlParameter[] parameters =                
                { 
                   new SqlParameter("@string", descricao),
                   new SqlParameter("@int", codigo)

                };
                using (SqlDataReader sqlDataReader = ExecuteReader(storedProssidere, parameters))
                {
                    while (sqlDataReader.Read())
                    {
                        DTOProduto dtoProduto = CriarProduto(sqlDataReader);

                        lstProduto.Add(dtoProduto);
                    }
                }
            }
            catch (SqlException)
            {
                throw;
            }
            return lstProduto;
        }

    }
}
